<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 1. 同：必须添加不重复的值
    // 和set区别1：值必须是对象或者symbol的值，不能是其他类型的值
    let set1 = new WeakSet();
    set1.add(Symbol()) // 不报错 但是
    // set1.add(1) // 报错
    console.log(set1, 'set1');
    // let ws = new WeakSet([1,2,3]) // 这样也是错的，因为会把1,2,3当做成员添加给ws

    let a = [[1,2,3], [4,5,6]] // [1,2,3]和[4,5,6]是成员添加给a了
    // let b = [1,2,3] // 这样添加是错误的
    let ws = new WeakSet(a)
    console.log(ws, 'ws');

    // 2. 如果其它对象都不再引用该对象，垃圾回收机制会释放掉这个对象，weakSet里面引用或者不引用不重要了
    let obj = {
      name: '123',
    }
    let set2 = new WeakSet()
    set2.add(obj)
    console.log(set2, 'set2');
    obj = null
    console.log(set2, 'set2 释放了吗'); // 手动按一下浏览器的垃圾回收按钮试试，就是被回收了
    console.log(set2.has(obj), 'set2.has(obj)'); // 如果obj = null, 那么这里打印的就是false，
    let obj2 = {name: '123'}
    set2.add(obj2)
    console.log(set2.delete(obj2), 'set2.delete(obj2)'); // 删除成功，打印true

    // 3. 因为在与不在，不稳定，所以不可以被遍历
    // for (const item of set2) {
    //   console.log(item, 'item');
    // }
    // console.log(set2.keys(), 'set2.keys');
    // console.log(set2.values(), 'set2.keys');
    // set2.forEach(item => {
    //   console.log(item, 'item');
    // })


    // 4. 用处
    // 适合用来存储dom节点，不用担心dom节点从文档移除了，而引发内存泄漏，因为只要文档没有引用了，垃圾回收机制会自动删掉set
  </script>
</body>
</html>